"""
难度：简单
给定一个头结点为 head 的非空单链表，返回链表的中间结点。
如果有两个中间结点，则返回第二个中间结点。
示例 1：
输入：[1,2,3,4,5]
输出：此列表中的结点 3 (序列化形式：[3,4,5])
返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
注意，我们返回了一个 ListNode 类型的对象 ans，这样：
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.
示例 2：
输入：[1,2,3,4,5,6]
输出：此列表中的结点 4 (序列化形式：[4,5,6])
由于该列表有两个中间结点，值分别为 3 和 4，我们返回第二个结点。
"""

"""题目大意 #
给定一个单链表，返回链表的中间节点。如果有两个中间节点，则返回第二个中间节点。"""
"""1. 单指针遍历 #
先遍历一遍链表，统计一下节点个数为 n，再遍历到 n / 2 的位置，返回中间节点。

2. 快慢指针 #
常规思路是：先遍历一遍链表，统计一下节点个数为 n，再遍历到 n / 2 的位置，返回中间节点。

我们也可以使用步长不一致的快慢指针进行一次遍历找到链表的中间节点。具体做法如下：

使用两个指针 slow、fast。slow、fast 都指向链表的头节点。
在循环体中将快、慢指针同时向右移动。其中慢指针每次移动 1 步，即 slow = slow.next。快指针每次移动 2 步，即 fast = fast.next.next。
等到快指针移动到链表尾部（即 fast == Node）时跳出循环体，此时 slow 指向链表中间位置。
返回 slow 指针。"""


# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next
class Solution:
    def middleNode(self, head: ListNode) -> ListNode:
        # 单指针遍历
        n = 0
        curr = head
        while curr:
            n += 1
            curr = curr.next
        k = 0
        curr = head
        while k < n // 2:
            k += 1
            curr = curr.next
        return curr
        # 快慢指针
    def middleNode(self,head: ListNode) -> ListNode:
        fast = head
        slow = head
        while fast and fast.next:
            slow = slow.next
            fast = fast.next.next
        return slow


    def middleNode(self,head: ListNode) -> ListNode:
        A = [head]
        while A[-1].next:
            A.append(A[-1].next)
        return A[len(A) // 2]

        